from django.db import models
from django.utils.timezone import now

# Create your models here.

class Tag(models.Model):
    name = models.CharField(verbose_name='标签名', max_length=60)    # Varchar(64) comment
    created_time = models.DateTimeField(verbose_name='创建时间', default=now)   # django中时间用自带的 timezone_time生成，假设现在10:00，数据库中存的是2:00,。setting中需要正确设置时区
    last_mod_time = models.DateTimeField(verbose_name='修改时间', default=now)

    # 使对象在后台显示跟友好   默认[<class Tag>,<>]  ['python', 'django']
    def __str__(self):
        return self.name
    class Meta:
        ordering = ['name']
        verbose_name = '标签名'
        verbose_name_plural = '标签列表'
        db_table = 'blog_tag'  # 数据库名


class Category(models.Model):
    """ 分类表/目录表 """
    name = models.CharField(verbose_name='类别名称', max_length=60)
    created_time = models.DateTimeField(verbose_name='创建时间', default=now)
    last_mod_time = models.DateTimeField(verbose_name='修改时间', default=now)

    class Meta:
        ordering = ['name']
        verbose_name = '类别名称'
        verbose_name_plural = '分类列表'
        db_table = 'blog_category'
    def __str__(self):
        return self.name

class Article(models.Model):
    STATUS_CHOICES = (
        ('d', '草稿'),
        ('p', '发表'),
    )
    title = models.CharField(verbose_name='标题', max_length=100)
    content = models.TextField(verbose_name='正文', blank=True, null=True)
    status = models.CharField(verbose_name='状态', max_length=5, choices=STATUS_CHOICES, default='p')
    views = models.PositiveIntegerField(verbose_name='浏览量', default=0)
    created_time = models.DateTimeField(verbose_name='创建时间', default=now)
    pub_time = models.DateTimeField(verbose_name='发布时间', blank=True, null=True)
    last_mod_time = models.DateTimeField(verbose_name='修改时间', default=now)
    category = models.ForeignKey(Category,verbose_name='分类', on_delete=models.CASCADE, blank=False, null=False)
    tags = models.ManyToManyField(Tag, verbose_name='标签集合', blank=True)

    # 便对象在后台显示跟友好
    def __str__(self):
        return self.title

    # 更新浏览器
    def viewed(self):
        self.views += 1
        self.save(update_fields=['views'])

    # 下一篇
    def next_article(self):   # id比当前id大，状态为已发布，发布时间不为空
        return Article.objects.filter(id_gt=self.id, status='p', pub_time__isnull=False).first()

    class Meta:
        ordering = ['-pub_time']  # 按文章创建日期降序
        verbose_name = '文章'     # 指定后台显示模型名称
        verbose_name_plural = '文章列表'  # 指定后台显示模型复数名称
        db_table = 'article'
        get_latest_by = 'created_time'


"""
分析： 
1. 文章表（标题，主图url地址，正文，浏览量，发布时间，最近更新时间，目录.id，标签，评论）
2. 目录表 (id，名字，创建时间，修改时间)  。目录表 → 文章表  →  一对多的关系(外键,最常见)
3. 标签表 (id，名字，创建时间，修改时间)。标签表 → 文章表   多对多关系。
4. 文章_标签表(id，文章.id，标签表.id)。 # 多对多关系时发现一张表中的外键不好表达，需要一张关系映射表处理两张表的联系。
"""